#include <string>
#include <map>
#include <list>

using namespace std;

class StrVec {
    public:
        StrVec& operator=(initializer_list<string>);
    private:
        // 工具函数，被拷贝构造函数、赋值运算符和析构函数所使用
        pair<string*, string*> alloc_n_copy(const string*, const string*);
        void free();                    // 销毁元素并释放内存
        string *elements;               // 指向数组首元素的指针
        string *first_free;             // 指向数组第一个空闲元素的指针
        string *cap;                    // 指向数组尾后位置的指针
};

StrVec& StrVec::operator=(initializer_list<string> il)
{
    // alloc_n_copy 分配内存空间并从给定范围内拷贝元素
    auto data = alloc_n_copy(il.begin(), il.end());
    free();                             // 销毁对象中的元素并释放内存空间
    elements = data.first;              // 更新数据成员使其指向新空间
    first_free = cap = data.second;
    return *this;
}